package com.mashibing.api.filter.impl;

/**
 * @ClassName:ApiKeyCheckFilter
 * @author:[开发者名称]
 * @Description:[类的功能描述]
 * @Date:2025/9/13/19:32
 * @Version:1.0
 */

import com.mashibing.api.client.BeaconCacheClient;
import com.mashibing.api.filter.CheckFilter;
import com.mashibing.common.constant.ApiConstant;
import com.mashibing.common.constant.CacheConstant;
import com.mashibing.common.enums.ExceptionEnums;
import com.mashibing.common.exception.ApiException;
import com.mashibing.common.model.StandardSubmit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.Set;

/**
 * 校验客户的短信签名模版
 */
@Component("sign")
@Slf4j
public class SignCheckFilter implements CheckFilter {
    @Autowired
    BeaconCacheClient beaconCacheClient;//服务发现调用接口模块
    /**
     * 截取签名的开始索引
     */
    private final int SIGN_START_INDEX = 1;

    /**
     * 客户存储签名信息的字段
     */
    private final String CLIENT_SIGN_INFO = "signInfo";
    /**
     * 签名的id   可通过id查询对应的短信模版信息
     */
    private final String SIGN_ID="id";


    @Override
    public void check(StandardSubmit standardSubmit) {
        log.info("【接口模块校验短信1签名模版:{}】------------------------",standardSubmit);
        //判断用户短信是否携带签名  即【签名信息】
        String text = standardSubmit.getText();
        if(!text.startsWith(ApiConstant.SIGN_PREFIX) || !text.contains(ApiConstant.SIGN_SUFFIX)){
            log.info("【接口模块-校验签名】   无可用签名 text = {}",text);
            throw new ApiException(ExceptionEnums.ERROR_SIGN);
        }
        //将短信内容的签名获取到【括号里的内容】+非空校验
        String sign = text.substring(SIGN_START_INDEX, text.indexOf(ApiConstant.SIGN_SUFFIX));
        if(StringUtils.isEmpty(sign)){
            log.info("【接口模块-校验签名】   无可用签名 text = {}",text);
            throw new ApiException(ExceptionEnums.ERROR_SIGN);
        }
        //从缓存中获取客户绑定的签名
        //3. 从缓存中查询出客户绑定的签名
        Set<Map> set = beaconCacheClient.smember(CacheConstant.CLIENT_SIGN + standardSubmit.getClientId());
        if(set == null || set.size() == 0){
            log.info("【接口模块-校验签名】   无可用签名 text = {}",text);
            throw new ApiException(ExceptionEnums.ERROR_SIGN);
        }
        //4. 判断~
        for (Map map : set) {
            if(sign.equals(map.get(CLIENT_SIGN_INFO))){
                log.info("【接口模块-校验签名】   找到匹配的签名 sign = {}",sign);
                standardSubmit.setSign(sign);//【sign客户签名等同于戴尔/DELL】==【戴尔/DELL】==我们获取到的是这个--戴尔/DELL
                standardSubmit.setSignId(Long.valueOf(map.get(SIGN_ID)+""));//签名的id   可通过id查询对应的短信模版信息
                System.out.println("=======Sign===========SignId"+sign +"----------"+map.get(SIGN_ID));
                return;
            }
        }

        //5. 到这，说明没有匹配的签名
        log.info("【接口模块-校验签名】   无可用签名 text = {}",text);
        throw new ApiException(ExceptionEnums.ERROR_SIGN);





    }
}
